import org.codehaus.groovy.util.StringUtil

/**
 * 上传文件
 * @param ip 服务器ip
 * @param localPath 本地文件目录
 * @param remotePath 远程文件目录
 * @param fileName 文件名
 */
void call(String ip, String localPath, String remotePath, String fileName) {
    withCredentials([sshUserPrivateKey(credentialsId: 'ssh_key',  // 凭证 ID
            keyFileVariable: 'SSH_KEY',
            usernameVariable: 'USER')]) {
        sh(script: """
                   # 1. 配置参数
                        LOCAL_FILE=${localPath}${fileName}                                   # 本地文件路径（根据实际修改）
                        REMOTE_IP=${ip}                                                       # 远程服务器 IP
                        REMOTE_DIR=${remotePath}                                              # 远程目标目录
                        SSH_DIR="/var/jenkins_home/.ssh"                                      # Jenkins 容器可写的 .ssh 目录
                        REMOTE_FILE=${remotePath}${fileName}        
                        if [ ! -e "\$LOCAL_FILE" ]; then
                            echo "错误：本地路径 \$LOCAL_FILE 不存在！"
                            exit 1
                        elif [ -d "\$LOCAL_FILE" ]; then
                            echo "准备上传目录 \$LOCAL_FILE "
                        else
                            echo "准备上传文件 \$LOCAL_FILE "
                        fi
                        
                        # 3. 创建可写的 .ssh 目录并添加远程主机密钥（解决主机验证问题）
                        mkdir -p \$SSH_DIR && chmod 700 \$SSH_DIR
                        ssh-keyscan \$REMOTE_IP >> \$SSH_DIR/known_hosts
                        chmod 600 \$SSH_DIR/known_hosts  # 严格权限，避免 SSH 拒绝使用
                        
                        # 4. 确保远程服务器的目标目录存在（如需创建）
                        ssh -o UserKnownHostsFile=\$SSH_DIR/known_hosts \\
                            -i \$SSH_KEY \\
                            \$USER@\$REMOTE_IP \\
                            "mkdir -p \$REMOTE_DIR && chmod 755 \$REMOTE_DIR"
                        
                        # 5. 使用 scp 上传文件（指定 known_hosts 路径，避免主机验证失败）
                        echo "开始上传文件：\$LOCAL_FILE -> \$USER@\$REMOTE_IP:\$REMOTE_DIR"
                        scp -r  -o UserKnownHostsFile=\$SSH_DIR/known_hosts \\
                            -i \$SSH_KEY \\
                            \$LOCAL_FILE \\
                            \$USER@\$REMOTE_IP:\$REMOTE_DIR
                        
                        # 6. 验证上传结果（检查远程文件是否存在）
                        echo "验证上传结果..."
                       
                       if ssh -o UserKnownHostsFile="\$SSH_DIR/known_hosts" \\
                       -i "\$SSH_KEY" \\
                        "\$USER@\$REMOTE_IP" \\
                        "[ -e \\"\${REMOTE_FILE}\\" ]"; then
   
                                 # 进一步判断是文件还是目录
                                if ssh -o UserKnownHostsFile="\$SSH_DIR/known_hosts" \\
                                -i "\$SSH_KEY" \\
                                "\$USER@\$REMOTE_IP" \\
                                "[ -d \\"\${REMOTE_FILE}\\" ]"; then
                                echo "目录上传成功：\${REMOTE_FILE}"
                            else
                                echo "文件上传成功：\${REMOTE_FILE}"
                            fi
                        else
                             echo "错误：路径未在远程服务器上找到！"
                             exit 1
                        fi
                       
                    """)
    }

}


